---
title: Worker 0.16 released
description:
  Graphile Worker Version 0.16 is now ready, and brings a new plugin system
  along with many other features!
slug: 2023-12-11-016-release
authors:
  - name: Benjie
    title: Creator of Worker
    url: https://github.com/Benjie
    image_url: https://github.com/Benjie.png
  - name: Jem
    title: "“I wear many hats”"
    url: https://fosstodon.org/@jem
    image_url: https://github.com/jemgillam.png
tags: [releases]
---

import FooterImage from "@site/static/img/homepage/ant-footer.svg";

## Reliable, extensible and performant

Worker 0.16 is here — freshly updated with optional TypeScript typing for tasks,
a public `jobs` interface, a new plugin system, and much more besides!

The new plugin system enables ESM and CommonJS to peacefully coexist, adds
support for writing tasks in `import()`–capable compile–to–JS languages like
TypeScript, adds support for writing tasks in alternative languages (e.g.
Python, Ruby, Rust), and could open the door to a lot more customizability in
future! Version 0.16 also introduces support for “Worker Pro” — a plugin
available to most Sponsors which monitors running workers, releases locked jobs
from workers that exit uncleanly, helps ease migrations to new releases, and
will add more quality–of–life improvements in time.

We’ve backported a large amount of v0.16’s functionality to v0.13 and v0.15;
this includes plugin and Worker Pro support to ease migration to the new
version.

Thank you to each and every one of our sponsors, together you have made this
massive release possible!

<div class="prettyDivide">

<FooterImage />

</div>

### What’s new in Version 0.16?

#### Graphile Worker gets a logo!

Inspired by the Graphile heart and the PostGraphile elephant, Graphile Worker
gets its new heart–shaped worker–ant logo. We admire the industriousness of
rainforest leaf–cutter ants, relentlessly working away traversing miles of
branches to bring food and messages back to their colony. What better animal to
represent the spirit of Graphile Worker?

<figure>

[![The new Graphile Worker logo is an ant face](../static/img/news/2023-11-29-graphile-logos.svg)](../static/img/news/2023-11-29-graphile-logos.svg)

</figure>

#### New Graphile Worker website!

As Graphile Worker’s featureset has been growing, managing it all through a
README has become challenging, both for users and for maintenance. We’ve moved
all the documentation to a new website and spent some time overhauling it with
new tips and notes (and corrections). You’re on that new site right now! See the
new documentation at [worker.graphile.org/docs/](/docs/).

#### Graphile Config and the new plugin system

Worker is now optionally configurable with [Graphile Config](/docs/config/).
This enables a whole suite of new options and features, not the least of which
is you can now share preset files across multiple projects! Graphile Config
takes everything we’ve learned from the PostGraphile project relating to
configuration and plugins and expands these capabilities into a generic system
that Worker can leverage. The plumbing has been completed, the initial hooks are
there and ready to be used by everyone to make Worker even more adaptable and
powerful than ever before. If you need to do something that there’s not a hook
for yet, adding a suitable one is likely straightforward… get in touch for
guidance!

#### Native ESM support!

The first thing we did with the new plugin system was to move the code for
loading a task into its own plugin, and add support for loading both CommonJS
files and ESM files. Since it’s a plugin, you can replace it entirely, loading
tasks in any way you see fit!

#### Compile–to–JS language support!

With the plugin mentioned above you can add more file extensions to your config
for any “compile–to–javascript” language that can be `import()`–ed — just be
sure to make the relevant "loaders" available, e.g. for native TypeScript
support you might use `NODE_OPTIONS="--loader ts-node/esm" npx graphile-worker`

#### Tasks in even more languages!

And the fun doesn't stop there! We've added another built–in plugin that allows
us to offer support for writing task executors in other languages entirely:
python, bash, even _fortran_; choose whichever language makes the most sense for
the task at hand. All you need to do is place an executable file in the `tasks/`
folder and ensure it's named with the task identifier (extensions are ignored).

#### abortSignal

We have added the JavaScript pattern of `abortSignal` — a new ability to tell
tasks to abort during shutdown. This means no more waiting for the task to
complete during a graceful shutdown, so long as your task executor remembers to
listen for the `abortSignal` your job can exit quickly when the worker is
shutting down, and boot up again soon thereafter on a different worker.

#### Opt–in TypeScript typing of tasks

Now you can take down the guard rails, and _assume_ the job type using the new
`GraphileWorker.Tasks` global interface. This is not for the faint of heart, and
in fact we don’t generally recommend it! But it has been requested many times,
and now it is available to use via a public–facing declaration–mergeable
interface. Declaring a global task interface allows you to use auto–complete and
payload safety for `addJob` and `quickAddJob`, and specifies the assumed types
of the payloads of your task functions. More, including important caveats, can
be found [in our documentation](/docs/typescript).

<figure>

[![Felix Unger from the Odd Couple shows the word assume makes an ass out of u and me.](../static/img/news/2023-11-29-assumptions.jpg)](../static/img/news/2023-11-29-assumptions.jpg)

<figcaption>

Remember the caveats of
[what it means to assume…](https://youtu.be/KEP1acj29-Y?si=4UDpo9oLW5zbrvnh&t=41)

</figcaption>

</figure>

#### Public jobs view

This release makes it much clearer that the tables in which jobs and queues are
stored are private implementation details — Graphile Worker needs to be able to
change these tables to add new features or perform optimizations. For those
users who look into the jobs table, even though we advise against it, we've
created a public view that presents a stable interface into the queued jobs. We
strongly advise against polling this, it will impact the performance of your
worker, but it is now more suitable for usage in automated scripts since the
interface is stable.

#### Worker Pro: upgrade your experience!

With thanks to each and every sponsor (past and present) for reinvesting back
into open source, the growth of our community–based funding over the last six
years has enabled us to spend more and more time maintaining and improving our
[various open source packages](https://graphile.org). These past few months
we're grateful to welcome Trigger.dev and Seam as the latest in the
organizations reinvesting in the software they use — thank you!

Alas, a significant amount of our maintenance and development time is still
self–funded; so in an attempt to make this project more sustainable, we have
introduced the proprietary Worker Pro plugin, and initially made it available to
sponsors on the $25/mo tier and above.

Worker Pro adds worker tracking to Graphile Worker, making it a clean separation
from the open source version which does not track the individual workers. With
Worker Pro, each worker checks in with a "heartbeat" every so often, and we can
use this in various ways.

For example, we have had feedback from the community that having to stop all
workers in advance of updating to a new release is not ideal. With Worker Pro,
before performing a breaking migration a graceful shutdown of all old workers is
triggered, and further old workers are prevented from starting up. Once Worker
Pro has confirmed all old workers have completed their graceful shutdowns, the
migration can go ahead with significantly reduced risk of conflict. This avoids
the need to “scale to zero” as all workers will communicate with each other to
help the system as a whole remain consistent, and the newly running workers can
gracefully take over from the old.

This new plugin also helps with crashed worker recovery: once a configurable
amount of time has passed without receiving a heartbeat from a registered
worker, Worker Pro can assume that the worker is no longer running (power
pulled, killed, crashed, etc) and release all of its locked jobs to be
re–attempted.

There are a couple more major features planned for “Worker Pro”, and once they
are added it will be available via the $100 sponsorship tier. Now is a great
time to [sponsor Graphile](https://graphile.org/sponsor) and lock in this
awesome 75% discount launch offer for at least 18 months!

To get access to “Worker Pro”, please reach out to Benjie or Jem on Discord or
email team [at] graphile [dot] org — for the introductory offer you must ensure
you have access before the price goes up!

_Join our community — we run [a Discord server](https://discord.gg/graphile)
which can be used for community support and to chat to others using the Graphile
suite of developer tools. Find out how to sponsor us at
[graphile.org/sponsor](https://graphile.org/sponsor)._

_Full release notes found [on this site](/releases/) or
[at GitHub](https://github.com/graphile/worker/blob/main/RELEASE_NOTES.md)._

<figure>

[![A handdrawn image of an ant holding up a green heart](../static/img/news/ant-heart.svg)](../static/img/news/ant-heart.svg)

<figcaption>

Thank you Graphile sponsors!

</figcaption>

</figure>
